/**
  ******************************************************************************
  * @file    sym32l010_hal_btim.h
  * @author  AE Team
  * @version 1.0.4
  * @date    2024-06-03
  * @brief   Header file of BTIM HAL module.
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SYM32L010_HAL_BTIM_H
#define __SYM32L010_HAL_BTIM_H

#ifdef __cplusplus
extern "C" {
#endif


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "sym32l010_hal_def.h"


/******************************************************************************/
/* Global type definitions                                                    */
/******************************************************************************/
/* BTIM 基本模式 -------------------------------------------------------------*/
typedef enum
{
    BTIM_WORKMODE_TIMER        = (0x0UL << BTIMx_SMCR_SMS_Pos),       // 定时模式
    BTIM_WORKMODE_TRIGGER      = (0x1UL << BTIMx_SMCR_SMS_Pos),       // 触发模式
    BTIM_WORKMODE_GATE         = (0x2UL << BTIMx_SMCR_SMS_Pos),       // 门控模式
    BTIM_WORKMODE_COUNTER      = (0x3UL << BTIMx_SMCR_SMS_Pos)        // 计数模式
} BTIM_WorkModeTypeDef;

/* BTIM 单次触发使能控制 ------------------------------------------------------*/
typedef enum
{
    BTIM_ONESHOT_ENABLE        = (0x1UL << BTIMx_CR1_ONESHOT_Pos),    // 单次计数
    BTIM_ONESHOT_DISABLE       = (0x0UL << BTIMx_CR1_ONESHOT_Pos)     // 连续计数
} BTIM_OneShotEnTypeDef;

/* BTIM 触发输入源 ------------------------------------------------------------*/
typedef enum
{
    BTIM_TRGISRC_NONE          = (0x0UL << BTIMx_SMCR_TRGISRC_Pos),   // 无信号
    BTIM_TRGISRC_LVD_OUT       = (0x1UL << BTIMx_SMCR_TRGISRC_Pos),   // LVD_OUT   信号
    BTIM_TRGISRC_VCx_OUT       = (0x2UL << BTIMx_SMCR_TRGISRC_Pos),   // VCx_OUT   信号
                                                                      // --BTIM1 = VC1_OUT
                                                                      // --BTIM2 = VC2_OUT
                                                                      // --BTIM3 = NONE
    BTIM_TRGISRC_SPI_NCS       = (0x3UL << BTIMx_SMCR_TRGISRC_Pos),   // SPI_NCS   信号
    BTIM_TRGISRC_I2C_SCL       = (0x4UL << BTIMx_SMCR_TRGISRC_Pos),   // I2C_SCL   信号
    BTIM_TRGISRC_UARTx_RXD     = (0x5UL << BTIMx_SMCR_TRGISRC_Pos),   // UARTx_RXD 信号
                                                                      // --BTIM1 = UART1_RXD
                                                                      // --BTIM2 = UART2_RXD
                                                                      // --BTIM3 = NONE
    BTIM_TRGISRC_RTC_OUT       = (0x6UL << BTIMx_SMCR_TRGISRC_Pos),   // RTC_OUT   信号
    BTIM_TRGISRC_ATIM_TRGO     = (0x7UL << BTIMx_SMCR_TRGISRC_Pos),   // ATIM_Trgo 信号
    BTIM_TRGISRC_BTIM1_TRGO    = (0x8UL << BTIMx_SMCR_TRGISRC_Pos),   // BTIM1_Trgo信号
    BTIM_TRGISRC_BTIM2_TRGO    = (0x9UL << BTIMx_SMCR_TRGISRC_Pos),   // BTIM2_Trgo信号
    BTIM_TRGISRC_BTIM3_TRGO    = (0xAUL << BTIMx_SMCR_TRGISRC_Pos),   // BTIM3_Trgo信号
    BTIM_TRGISRC_GTIM1_TRGO    = (0xBUL << BTIMx_SMCR_TRGISRC_Pos),   // GTIM1 Trgo信号
    BTIM_TRGISRC_BTIMx_ETR     = (0xFUL << BTIMx_SMCR_TRGISRC_Pos)    // 外部 ETR  信号
                                                                      // --BTIM1 = BTIM1_ETR
                                                                      // --BTIM2 = BTIM2_ETR
                                                                      // --BTIM3 = BTIM3_ETR
} BTIM_TriggerSourceTypeDef;

/* BTIM 触发输入(TRGI)信号采样时钟与采样点数配置 -------------------------------*/
typedef enum
{
    BTIM_TRGIFLT_NONE           = (0x0UL << BTIMx_SMCR_TRGIFLT_Pos),  // 无滤波
    BTIM_TRGIFLT_PCLK1_N2       = (0x1UL << BTIMx_SMCR_TRGIFLT_Pos),  // PCLK    N = 2
    BTIM_TRGIFLT_PCLK1_N4       = (0x2UL << BTIMx_SMCR_TRGIFLT_Pos),  // PCLK    N = 4
    BTIM_TRGIFLT_PCLK1_N6       = (0x3UL << BTIMx_SMCR_TRGIFLT_Pos),  // PCLK    N = 6
    BTIM_TRGIFLT_PCLK4_N4       = (0x4UL << BTIMx_SMCR_TRGIFLT_Pos),  // PCLK/4  N = 4
    BTIM_TRGIFLT_PCLK4_N6       = (0x5UL << BTIMx_SMCR_TRGIFLT_Pos),  // PCLK/4  N = 6
    BTIM_TRGIFLT_PCLK8_N4       = (0x6UL << BTIMx_SMCR_TRGIFLT_Pos),  // PCLK/8  N = 4
    BTIM_TRGIFLT_PCLK8_N6       = (0x7UL << BTIMx_SMCR_TRGIFLT_Pos)   // PCLK/8  N = 6
} BTIM_TriggerFilterTypeDef;

/* BTIM 触发输入信号极性 -------------------------------------------------------*/
typedef enum
{
    BTIM_TRGIPOL_POSITIVE      = (0x0UL << BTIMx_SMCR_TRGIPOL_Pos),   // 正相-->触发:上升沿  门控:高电平
    BTIM_TRGIPOL_NEGATIVE      = (0x1UL << BTIMx_SMCR_TRGIPOL_Pos)    // 反相-->触发:下降沿  门控:低电平
} BTIM_TriggerPolarityTypeDef;

/* BTIM 计数值清零信号来源------------------------------------------------------*/
typedef enum
{
    BTIM_RSTISRC_NONE          = (0x0UL << BTIMx_SMCR_RSTISRC_Pos),   // 无复位信号
    BTIM_RSTISRC_I2C_LVD       = (0x1UL << BTIMx_SMCR_RSTISRC_Pos),   // I2C/LVD_OUT信号
                                                                      // --BTIM1 = I2C1_SCL
                                                                      // --BTIM2 = LVD_OUT
                                                                      // --BTIM3 = LVD_OUT
    BTIM_RSTISRC_VCx_OUT       = (0x2UL << BTIMx_SMCR_RSTISRC_Pos),   // VCx_OUT   信号
                                                                      // --BTIM1 = VC1_OUT
                                                                      // --BTIM2 = VC2_OUT
                                                                      // --BTIM3 = NONE
    BTIM_RSTISRC_SPI_NCS       = (0x3UL << BTIMx_SMCR_RSTISRC_Pos),   // SPI_NCS   信号
    BTIM_RSTISRC_UARTx_RXD     = (0x5UL << BTIMx_SMCR_RSTISRC_Pos),   // UARTx_RXD 信号
                                                                      // --BTIM1 = UART1_RXD
                                                                      // --BTIM2 = UART2_RXD
                                                                      // --BTIM3 = NONE
    BTIM_RSTISRC_RTC_OUT       = (0x6UL << BTIMx_SMCR_RSTISRC_Pos),   // RTC_OUT   信号
    BTIM_RSTISRC_ATIM_TRGO     = (0x7UL << BTIMx_SMCR_RSTISRC_Pos),   // ATIM_Trgo 信号
    BTIM_RSTISRC_BTIM1_TRGO    = (0x8UL << BTIMx_SMCR_RSTISRC_Pos),   // BTIM1_Trgo信号
    BTIM_RSTISRC_BTIM2_TRGO    = (0x9UL << BTIMx_SMCR_RSTISRC_Pos),   // BTIM2_Trgo信号
    BTIM_RSTISRC_BTIM3_TRGO    = (0xAUL << BTIMx_SMCR_RSTISRC_Pos),   // BTIM3_Trgo信号
    BTIM_RSTISRC_GTIM1_TRGO    = (0xBUL << BTIMx_SMCR_RSTISRC_Pos),   // GTIM1 Trgo信号
    BTIM_RSTISRC_BTIMx_ETR     = (0xFUL << BTIMx_SMCR_RSTISRC_Pos)    // 外部互联ETR信号
                                                                      // --BTIM1 = BTIM1_ETR
                                                                      // --BTIM2 = BTIM2_ETR
                                                                      // --BTIM3 = BTIM3_ETR
} BTIM_ResetSourceTypeDef;

/* BTIM 清零输入信号极性 -------------------------------------------------------*/
typedef enum
{
    BTIM_RSTIPOL_POSITIVE      = (0x0UL << BTIMx_SMCR_RSTIPOL_Pos),   // 上升沿
    BTIM_RSTIPOL_NEGATIVE      = (0x1UL << BTIMx_SMCR_RSTIPOL_Pos)    // 下降沿
} BTIM_ResetPolarityTypeDef;

/* BTIM 主/从模式配置 ---------------------------------------------------------*/
typedef enum
{
    BTIM_MSM_DISABLE           = (0x0UL << BTIMx_SMCR_MSM_Pos),       // 无操作
    BTIM_MSM_ENABLE            = (0x1UL << BTIMx_SMCR_MSM_Pos),       // 触发输入推迟
} BTIM_MasterSlaveModeTypeDef;

/* BTIM 输出信号TRGO配置 ------------------------------------------------------*/
typedef enum
{
    BTIM_TRGO_RESET           = (0x0UL << BTIMx_CR2_MMS_Pos),         // EGR.UPDATE或者触发输入产生的复位信号作为TRGO信号
    BTIM_TRGO_CREN            = (0x1UL << BTIMx_CR2_MMS_Pos),         // CR1.EN作为TRGO信号
    BTIM_TRGO_UPDATE          = (0x2UL << BTIMx_CR2_MMS_Pos),         // 更新事件作为TRGO信号
    BTIM_TRGO_OV              = (0x3UL << BTIMx_CR2_MMS_Pos),         // 溢出信号作为TRGO信号
} BTIM_TriggerOutTypeDef;

/* BTIM 初始化结构体 ----------------------------------------------------------*/
typedef struct
{
    BTIM_WorkModeTypeDef           WorkMode;                          // 工作模式
    uint32_t                       Prescaler;                         // 预分频值 0x0000~0xFFFF
    uint16_t                       Reload;                            // 自动重载值 0x0000~0xFFFF
    BTIM_OneShotEnTypeDef          OneShotEn;                         // 单次触发模式使能
    BTIM_MasterSlaveModeTypeDef    MasterSlaveMode;                   // 主/从模式配置 (用于同步两个TIM的触发启动)
} BTIM_InitTypeDef;


/******************************************************************************/
/* Global pre-processor symbols/macros ('#define')                            */
/******************************************************************************/
/* BTIM 中断触发源 ------------------------------------------------------------*/
#define BTIM_IT_SOURCE_TRIG             (BTIMx_DIER_TRIG_Msk)
#define BTIM_IT_SOURCE_UPDATE           (BTIMx_DIER_UPDATE_Msk)


/* BTIM 中断触发标志 ----------------------------------------------------------*/
#define BTIM_IT_FLAG_TRIG               (BTIMx_ISR_TRIG_Msk)
#define BTIM_IT_FLAG_UPDATE             (BTIMx_ISR_UPDATE_Msk)


/******************************************************************************/
/* Global macro function                                                      */
/******************************************************************************/
/**
  * @brief  将更新中断标志(UPDATE)重映射到BTIMx_CNT寄存器(Bit31)
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @retval None
  * @note   用户通过一次读操作即可同时获取计数值CNT以及更新标志ISR.UPDATE
  */
#define HAL_BTIM_UPDATEREMAP_ENABLE(BTIMx)       (BTIMx->CR1 |= BTIMx_CR1_REMAP_Msk)

/**
  * @brief  禁用更新中断标志(UPDATE)重映射
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @retval None
  */
#define HAL_BTIM_UPDATEREMAP_DISABLE(BTIMx)      (BTIMx->CR1 &= ~BTIMx_CR1_REMAP_Msk)

/**
  * @brief  置位 BTIMx_SMCR 寄存器的主从模式配置(MSM)位
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @retval None
  * @note   使能时，当前定时器的触发输入事件(TRGI)的动作被推迟，以使当
  *         前定时器与其从定时器实现完美同步（通过TRGO输出）
  */
#define HAL_BTIM_MSM_ENABLE(BTIMx)               (BTIMx->SMCR |= BTIMx_SMCR_MSM_Msk)

/**
  * @brief  重置 BTIMx_SMCR 寄存器的主从模式配置(MSM)位
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @retval None
  */
#define HAL_BTIM_MSM_DISABLE(BTIMx)              (BTIMx->SMCR &= ~BTIMx_SMCR_MSM_Msk)

/**
  * @brief  置位 BTIMx_CR1 寄存器的更新禁止控制(UDIS)位
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @retval None
  * @note   置位时，不会生成更新事件但如果向EGR.UPDATE写1，或者接收到
  *         从模式控制器生成的硬件复位，则会重新初始化计数器和预分频器
  */
#define HAL_BTIM_UDIS_ENABLE(BTIMx)              (BTIMx->CR1 |= BTIMx_CR1_UDIS_Msk)

/**
  * @brief  重置 BTIMx_CR1 寄存器的更新禁止控制(UDIS)位
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @retval None
  * @note   重置时，更新事件可通过以下事件生成：
  *             - 计数器上溢出
  *             - 向EGR.UPDATE写1
  *             - 通过从模式控制器生成的更新事件
  */
#define HAL_BTIM_UDIS_DISABLE(BTIMx)             (BTIMx->CR1 &= ~BTIMx_CR1_UDIS_Msk)

/**
  * @brief  置位 BTIMx_CR1 寄存器的更新请求源(URS)位
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @retval None
  * @note   置位时，只有计数器上溢出会生成更新中断或DMA请求(如果存在并且启用)
  */
#define HAL_BTIM_URS_ENABLE(BTIMx)               (BTIMx->CR1 |= BTIMx_CR1_URS_Msk)

/**
  * @brief  重置 BTIMx_CR1 寄存器的更新请求源(URS)位
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @retval None
  * @note   重置时，下列任何事件都会产生一个更新中断或DMA请求(如果存在并且启用):
  *             - 计数器上溢出
  *             - 向EGR.UPDATE写1
  *             - 通过从模式控制器生成的更新事件
  */
#define HAL_BTIM_URS_DISABLE(BTIMx)              (BTIMx->CR1 &=~ BTIMx_CR1_URS_Msk)

/**
  * @brief  获取 BTIM中断触发源
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @param  ITSOURCE: BTIM中断触发源
  *                   @arg BTIM_IT_SOURCE_TRIG
  *                   @arg BTIM_IT_SOURCE_UPDATE
  * @retval
  */
#define HAL_BTIM_GET_IT_SOURCE(BTIMx, ITSOURCE)  (BTIMx->DIER & (ITSOURCE))

/**
  * @brief  使能 BTIM中断触发源
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @param  ITSOURCE: BTIM中断触发源
  *                   @arg BTIM_IT_SOURCE_TRIG
  *                   @arg BTIM_IT_SOURCE_UPDATE
  * @retval
  */
#define HAL_BTIM_ENABLE_IT(BTIMx, ITSOURCE)      (BTIMx->DIER |= (ITSOURCE))

/**
  * @brief  关闭 BTIM中断触发源
  * @param  BTIMx   : BTIM名称
  *                   @arg SYM_BTIM1
  *                   @arg SYM_BTIM2
  *                   @arg SYM_BTIM3
  * @param  ITSOURCE: BTIM中断触发源
  *                   @arg BTIM_IT_SOURCE_TRIG
  *                   @arg BTIM_IT_SOURCE_UPDATE
  * @retval
  */
#define HAL_BTIM_DISABLE_IT(BTIMx, ITSOURCE)     (BTIMx->DIER &= ~((uint32_t)(ITSOURCE)))

/**
  * @brief  获取 BTIM中断触发标志
  * @param  BTIMx: BTIM名称
  *                @arg SYM_BTIM1
  *                @arg SYM_BTIM2
  *                @arg SYM_BTIM3
  * @param  FLAG : BTIM中断触发标志
  *                @arg BTIM_IT_FLAG_TRIG  
  *                @arg BTIM_IT_FLAG_UPDATE
  * @retval
  */
#define HAL_BTIM_GET_FLAG(BTIMx, FLAG)           (BTIMx->ISR & (FLAG))

/**
  * @brief  清除 BTIM中断触发标志
  * @param  BTIMx: BTIM名称
  *                @arg SYM_BTIM1
  *                @arg SYM_BTIM2
  *                @arg SYM_BTIM3
  * @param  FLAG : BTIM中断触发标志
  *                @arg BTIM_IT_FLAG_TRIG
  *                @arg BTIM_IT_FLAG_UPDATE
  * @retval
  */
#define HAL_BTIM_CLR_FLAG(BTIMx, FLAG)           (BTIMx->ICR = ~((uint32_t)(FLAG)))


/******************************************************************************/
/* Exported variables ('extern', definition in C source)                      */
/******************************************************************************/


/******************************************************************************/
/* Global function prototypes ('extern', definition in C source)              */
/******************************************************************************/
void     HAL_BTIM_Init(BTIM_TypeDef *BTIMx, BTIM_InitTypeDef *InitStruct);
void     HAL_BTIM_DeInit(BTIM_TypeDef *BTIMx);

void     HAL_BTIM_Start(BTIM_TypeDef *BTIMx);
void     HAL_BTIM_Stop(BTIM_TypeDef *BTIMx);

void     HAL_BTIM_DelayPclk(BTIM_TypeDef *BTIMx, uint16_t PclkCnt);
void     HAL_BTIM_SetReloadValue(BTIM_TypeDef *BTIMx, uint16_t ArrValue);
void     HAL_BTIM_SetCounterValue(BTIM_TypeDef *BTIMx, uint16_t CntValue);
uint16_t HAL_BTIM_GetCounterValue(BTIM_TypeDef *BTIMx);
uint16_t HAL_BTIM_IsRunning(BTIM_TypeDef *BTIMx);

void     HAL_BTIM_TOG_Enable(BTIM_TypeDef *BTIMx);
void     HAL_BTIM_TOG_Disable(BTIM_TypeDef *BTIMx);

void     HAL_BTIM_TriggerSource_Config(BTIM_TypeDef *BTIMx,
                                       BTIM_TriggerSourceTypeDef TriggerSource,
                                       BTIM_TriggerPolarityTypeDef TriggerPolarity,
                                       BTIM_TriggerFilterTypeDef TriggerFilter);
void     HAL_BTIM_ResetSource_Config(BTIM_TypeDef *BTIMx,
                                     BTIM_ResetSourceTypeDef TriggerSource,
                                     BTIM_ResetPolarityTypeDef ResetPolarity);
void     HAL_BTIM_TriggerOut_Config(BTIM_TypeDef *BTIMx, BTIM_TriggerOutTypeDef TriggerOut);

#ifdef __cplusplus
}
#endif

#endif /* __SYM32L010_HAL_BTIM_H */


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
